package de.e2it3t.schulverwaltung.ui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * Hauptframe der Anwendung. <br>
 * <br>
 * Die Anwendung besteht aus Tabs, welche verschiedene Inhalte repräsentieren.
 * Ein neuer Inhalt erbt von {@link AppView} und wird hier ergänzt.
 * 
 * @author Markus Kunz und Viktor Reiser
 * 
 * @see #showFrame() 
 */
public class AppFrame extends JFrame {
    
    private JTabbedPane tabbedPane;
    private AppView [] contentViews;
    
    
    /**
     * Startet die Anwendung und zeigt das Fenster.
     */
    public static void showFrame() {
        // starte das Fenster auf dem EDT
        // alle Aktionen in Swing finden im Event Dispatch Thread statt
        // die erste Aktion sollte somit auch auf dem EDT ausgeführt werden
        // dies ist nicht unbedingt notwendig, aber eine gute Konvention
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                // Themes sind alle total hässlich... deaktiviert
                /*try {
                    UIManager.setLookAndFeel(new PlasticLookAndFeel());
                } catch (UnsupportedLookAndFeelException ex) {
                    throw new RuntimeException(
                            "Failed to load look and feel!", ex);
                }*/
                
                // erstelle das Frame und zeige es an
                new AppFrame().setVisible(true);
            }
        });
    }
    
    private AppFrame() {
        super("Schulverwaltung");
        
        // Icon der Anwendung
        setIconImage(Toolkit.getDefaultToolkit().getImage(
                "images/frame_icon.png"));
        // zerstöre das Frame (und damit die Anwendung), wenn das Frame
        // geschlossen wird
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        // stelle sicher, dass das Frame eine minimale Größe hat
        setMinimumSize(new Dimension(850, 600));
        // dies sorgt dafür, dass das Frame zentriert wird
        setLocationRelativeTo(null);
        
        setupTabbedPane();
        
        // Hauptpanel, welches den Inhalt enthält
        // wir nutzen dieses um einen inneren Abstand zum TabbedPane zu
        // gewährleisten
        JPanel content = new JPanel();
        content.setBorder(new EmptyBorder(10, 10, 10, 10));
        content.setLayout(new BorderLayout());
        content.add(tabbedPane, BorderLayout.CENTER);
        
        setLayout(new BorderLayout());
        add(content, BorderLayout.CENTER);
    }
    
    private void setupTabbedPane() {
        tabbedPane = new JTabbedPane();
        contentViews = new AppView[] {
            new SchuelerView(),
            new KlasseView(),
            new LehreinheitView(),
            new LehreinheitNiceView(),
            new LehrblockView(),
            new KlassenUebersichtView(),
            new SchuelerSucheView()
        };
        
        // iteriere über alle vorhandenen Views und füge diese zum TabbedPane
        // hinzu
        for (AppView content : contentViews) {
            JPanel border = new JPanel();
            border.setBorder(new EmptyBorder(10, 10, 10, 10));
            border.setLayout(new BorderLayout());
            border.add(content.getView(), BorderLayout.CENTER);
            
            tabbedPane.addTab(content.getViewName(), border);
        }
        
        // View updaten, wenn der ensprechende Tab angeklickt wurde und die
        // View somit sichtbar wird
        tabbedPane.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent ce) {
                int index = tabbedPane.getSelectedIndex();
                contentViews[index].refreshView();
            }
        });
        
        // die erste View updaten, da diese auf jeden Fall beim Laden des Frames
        // sichtbar sein wird
        contentViews[0].refreshView();
    }
}
